package com.zf.mail.service;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * 发送邮件：
 * <p>
 * 收件人、抄送人、隐秘抄送人 的邮箱只要满足邮箱格式就行，
 * 是不是真邮箱都没有关系，邮件都能发出，至于能不能被收到则取决于收件邮箱是否有效。
 */
@Service
public class SendMailService {
    @Autowired
    private JavaMailSender javaMailSender;
    @Autowired
    private MailProperties mailProperties;

    // thymeleaf模板引擎
    @Autowired
    private TemplateEngine templateEngine;

    /**
     * 发送简单文本邮件
     */
    public void sendSimpleTextMail() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        // 发件人，必须和application.yml中配置的 username 相同
        simpleMailMessage.setFrom(mailProperties.getUsername());

        // 收件人，可以写多个
        simpleMailMessage.setTo("ddhtfbgbaq@iubridge.com", "kotora9855@fanneat.com");

        // 抄送（Carbon Copy）人，可以写多个，如果没有抄送人不配置即可
        simpleMailMessage.setCc("qn0bl2+1dzjlist18cfc@sharklasers.com");
        // simpleMailMessage.setCc("", "");

        // 隐秘抄送（Blind Carbon Copy）人，可以写多个，隐秘抄送人可以看到邮件的收件人和抄送人，但是邮件的收件人和抄送人无法知道隐秘抄送人
        // 如果没有隐秘抄送人不配置即可
        simpleMailMessage.setBcc("iywoogt560@wimsg.com");

        // 邮件的主题（标题），可以不配置
        simpleMailMessage.setSubject("测试主题");

        // 邮件正文内容，必须要配置，可以是空字符串，不配置就报错
        simpleMailMessage.setText("测试内容");

        // 发送时间，可以不配置，没有影响
        // simpleMailMessage.setSentDate(new Date());

        // 发送邮件
        javaMailSender.send(simpleMailMessage);
    }

    /**
     * 发送内容是html的邮件
     */
    public void sendHtmlContentMail() throws MessagingException {
        // 邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        // true设置邮件支持多部分，包括html和附件等内容
        // 通过 MimeMessageHelper 设置 MimeMessage 的一些属性
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
        // 发件人
        messageHelper.setFrom(mailProperties.getUsername());

        // 收件人，可以设置多个
        messageHelper.setTo("kotora9855@fanneat.com");
        // messageHelper.setTo(new String[]{"", ""});

        // 抄送人，可以设置多个
        // messageHelper.setCc(new String[]{"", ""});

        // 隐秘抄送，可以设置多个
        // messageHelper.setBcc(new String[]{"", ""});

        // 设置主题
        messageHelper.setSubject("测试html");

        // 设置邮件正文内容，并标识为 html
        messageHelper.setText("<h1>你好</h1>", true);

        // 发送邮件
        javaMailSender.send(mimeMessage);
    }

    /**
     * 发送的内容是html且其中内联图片
     */
    public void sendHtmlWithImageContentMail() throws MessagingException {
        // 邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        // true设置邮件支持多部分，包括html和附件等内容
        // 通过 MimeMessageHelper 设置 MimeMessage 的一些属性
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());

        // 发件人
        messageHelper.setFrom(mailProperties.getUsername());

        // 收件人，可以设置多个
        messageHelper.setTo("kotora9855@fanneat.com");

        // 设置主题
        messageHelper.setSubject("测试html内联图片");

        // 设置邮件正文内容，并标识为 html
        messageHelper.setText(
                "图片1：<img src='cid:p1'/>"
                        + "图片2：<img src='cid:p2'/>",
                true
        );

        // 设置内联资源，名称和 "cid:" 后面的名称保持一致，这样才能渲染到对应位置，没有设置或者名称不一致的就不会渲染成功
        messageHelper.addInline("p1", new ClassPathResource("code1.png"));
        // messageHelper.addInline("p2", new ClassPathResource("code2.png"));

        // 发送邮件
        javaMailSender.send(mimeMessage);
    }

    /**
     * 发送带附件的邮件
     */
    public void sendWithAttachmentMail() throws MessagingException {
        // 邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        // true设置邮件支持多部分，包括html和附件等内容
        // 通过 MimeMessageHelper 设置 MimeMessage 的一些属性
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
        // 设置编码附件名称，防止乱码
        messageHelper.setEncodeFilenames(true);

        // 发件人
        messageHelper.setFrom(mailProperties.getUsername());

        // 收件人，可以设置多个
        messageHelper.setTo("qn086x+cw2z1s4nasfjc@sharklasers.com");

        // 设置主题
        messageHelper.setSubject("测试附件");

        // 设置邮件正文内容
        messageHelper.setText("见附件");

        // 设置附件, 附件名 -> 文件，附件名最好指定后缀名，不然无法预览，名称可以为空字符串，但是这样无法预览
        messageHelper.addAttachment("附件1", new ClassPathResource("code1.png"));
        messageHelper.addAttachment("附件2.png", new ClassPathResource("code2.png"));

        // 发送邮件
        javaMailSender.send(mimeMessage);
    }

    /**
     * 综合，html+内联图片+附件
     */
    public void sendCompositeContentMail() throws MessagingException {
        // 邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        // true设置邮件支持多部分，包括html和附件等内容
        // 通过 MimeMessageHelper 设置 MimeMessage 的一些属性
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
        // 设置编码附件名称，防止乱码
        messageHelper.setEncodeFilenames(true);

        // 发件人
        messageHelper.setFrom(mailProperties.getUsername());

        // 收件人，可以设置多个
        messageHelper.setTo("kotora9855@fanneat.com");

        // 设置主题
        messageHelper.setSubject("测试综合");

        // 设置邮件正文内容，并标识为 html
        messageHelper.setText(
                "<h3>图片列表：</h3>" +
                        "图片1：<img src='cid:p1'/>"
                        + "图片2：<img src='cid:p2'/>",
                true
        );
        // 设置内联资源
        messageHelper.addInline("p1", new ClassPathResource("code1.png"));
        messageHelper.addInline("p2", new ClassPathResource("code2.png"));


        // 设置附件, 附件名 -> 文件
        messageHelper.addAttachment("附件1.png", new ClassPathResource("code1.png"));
        messageHelper.addAttachment("附件2.png", new ClassPathResource("code2.png"));

        // 发送邮件
        javaMailSender.send(mimeMessage);
    }


    /**
     * 动态生成文件，并作为附件发出
     */
    public void sendDynamicAttachmentContentMail() throws MessagingException, IOException {
        // 邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        // true设置邮件支持多部分，包括html和附件等内容
        // 通过 MimeMessageHelper 设置 MimeMessage 的一些属性
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
        // 设置编码附件名称，防止乱码
        messageHelper.setEncodeFilenames(true);

        // 发件人
        messageHelper.setFrom(mailProperties.getUsername());

        // 收件人，可以设置多个
        messageHelper.setTo("kotora9855@fanneat.com");

        // 设置主题
        messageHelper.setSubject("测试动态生成附件内容");

        // 设置邮件正文内容
        messageHelper.setText("见附件");

        byte[] content;
        // 创建一个excel
        XSSFWorkbook workbook = new XSSFWorkbook();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try (workbook; outputStream) {
            // 创建一个sheet，不必写入数据
            workbook.createSheet();
            workbook.write(outputStream);
            content = outputStream.toByteArray();
        }

        // 设置附件, 附件名 -> 文件
        messageHelper.addAttachment("附件.xlsx", new ByteArrayResource(content));

        // 发送邮件
        javaMailSender.send(mimeMessage);
    }

    /**
     * 发送 使用 thymeleaf模板引擎 渲染模板产生的html
     */
    public void sendTemplateHtmlContentMail() throws MessagingException {
        // 邮件
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        // true设置邮件支持多部分，包括html和附件等内容
        // 通过 MimeMessageHelper 设置 MimeMessage 的一些属性
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());

        // 发件人
        messageHelper.setFrom(mailProperties.getUsername());

        // 收件人，可以设置多个
        messageHelper.setTo("qn5f6p+4wtyag3s9o3mc@sharklasers.com");

        // 设置主题
        messageHelper.setSubject("测试模板邮件");

        // 模板参数
        Context context = new Context();
        context.setVariable("username", "李四");
        context.setVariable("age", 22);
        // 渲染模板产生html
        String html = templateEngine.process("mail_template", context);
        // 设置邮件正文内容为html类型
        messageHelper.setText(html, true);

        // 发送邮件
        javaMailSender.send(mimeMessage);
    }

}
